# @Time : 2023/1/6
# @Author : SDAJAVA

from bs4 import BeautifulSoup

# 解析本地文件
# 默认打开文件的编码格式是GBK 所以要指定编码格式
soup = BeautifulSoup(open('./BeautifulSoup使用.html', encoding="utf-8"), "lxml")
# 找到的是第一个符合条件的数据
print(soup.a)
# 获取标签的属性和属性值
print(soup.a.attrs)

# bs4的函数
# find  返回第一个符合的条件的数据
print(soup.find("a"))
# 根据title的值来找到对应的对象
print(soup.find("a", title="a2"))
# 根据class的值来找到对应的标签对象，注意class需要加下划线
print(soup.find("a", class_="a2"))

# find_all
# 返回一个列表,返回所有a标签
print(soup.find_all("a"))
# 如果要获取多个标签的数据，那么需要在find_all的参数中添加列表数据
print(soup.find_all(["a", "span"]))
# limit作用，查找前几个数据
print(soup.find_all("li", limit=2))

# select（推荐）
# 返回一个列表，并且返回多个数据
print(soup.select("a"))
# 通过.代表class 我们把这种操作叫做类型选择器
print(soup.select(".a1"))
print(soup.select('#l1'))

# 属性选择器----通过属性来寻找对应的标签
# 查找li标签中有id的标签
print(soup.select("li[id]"))
# 查找li标签中有id为l2的标签
print(soup.select("li[id='l2']"))

# 层级选择器
#     后代选择器
# 找到div下面的li
print(soup.select("div li"))
#     子代选择器
# 某标签的第一级标签
print(soup.select("div>ul>li"))
# 找到a标签和li标签的所有对象
print(soup.select("a,li"))

# 节点信息
# 获取节点内容
obj = soup.select("#d1")[0]
# 如果标签对象中只有内容，两个都可以
# 如果标签对象中，除了内容还有标签，string获取不到数据，get_text()是可以获取到数据的
# 一般情况下，推荐使用get_text()
print(obj.string)
print(obj.get_text())

# 节点属性
obj = soup.select("#p1")[0]
# name是标签的名字
print(obj.name)
# 将属性值作为一个字典返回
print(obj.attrs)

# 获取节点的属性
obj = soup.select("#p1")[0]
print(obj.attrs.get("class"))  # 推荐
print(obj.get("class"))
print(obj["class"])
